package leetcode;

/**
 * 224. 基本计算器
 * 实现一个基本的计算器来计算一个简单的字符串表达式 s 的值。
 * 示例 1：
 * 输入：s = "1 + 1"
 * 输出：2
 * 示例 2：
 * 输入：s = " 2-1 + 2 "
 * 输出：3
 * 示例 3：
 * 输入：s = "(1+(4+5+2)-3)+(6+8)"
 * 输出：23
 * 提示：
 * 1 <= s.length <= 3 * 105
 * s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
 * s 表示一个有效的表达式
 */

import java.util.Deque;
import java.util.Stack;
import java.util.concurrent.LinkedBlockingDeque;

public class problems_224 {

    public static void main(String[] args) {
        System.out.println(new Solution().calculate("0-2147483647"));
    }

    static class Solution {
        public int calculate(String s) {
            if(null == s || s.isEmpty()) return 0;
            //
            int value = 0; // 数值
            int sign = 1; // 标志符号
            Deque<Integer> signDeque = new LinkedBlockingDeque<>();
            signDeque.push(1);
            //
            for (int i = 0; i < s.length(); i++) {
                switch (s.charAt(i)){
                    case ' ':
                        break;
                    case '+':
                        sign = signDeque.peek();
                        break;
                    case '-':
                        sign = -signDeque.peek();
                        break;
                    case '(':
                        signDeque.push(sign);
                        break;
                    case ')':
                        signDeque.pop();
                        break;
                    default:
                        int initIndex = i;
                        // 数字时
                        int temp = 0;
                        while (i< s.length() && s.charAt(i) >= '0' && s.charAt(i) <= '9'){
                            temp = temp * 10 + (s.charAt(i) - '0');
                            i++;
                        }
                        value += temp * sign;
                        if(initIndex!=i) i--;
                        break;
                }
            }
            return value;
        }
    }
}